异常是程序运行过程中出现的错误。例如:分母为0,数组超出设置的长度啊等等……
异常类是Throwable类,Throwable
类是 Java 语言中所有错误或异常的父类。
异常的分类:
Throwable下面有Error和Exception两个子类。
Error是程序无法处理的错误,比如OutOfMemoryError(内存溢出)、ThreadDeath(线程死亡)等。
这些异常发生时, Java虚拟机(JVM)一般会选择线程终止。是一种比较严重的错误,程序并不能自己解决。
重点讲Exception类,下面分RuntimeException异常和非RuntimeException异常(也就是运行时异常和非运行时异
常),运行时异常是不检查异常,程序中可以选择捕获处理,也可以不处理。
这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
常见的RuntimeException异常有:
1.NullPointerException(空指针异常) eg:String s =null; System.out.println(s.length()); s对象为空,无法调用他的方法;
2.ArithmeticException(算术逻辑异常) eg:System.out.println(12/0);
3.ClassCastException(类型转换异常)eg:int temp="abc";
4.NumberFormatException(数字格式化异常) 将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。
eg: String str="123456*s",int
a = Integer.parseInt(str)
5.ArrayIndexOutOfBoundsException(数组下标越界异常)
eg:int []a ={1,5,6,8};System.out.println(a[5]);
非运行是异常,从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。
如IOException、SQLException、ClassNotFound等。
异常了解了,接下来是异常的处理。
异常的处理大体上有三种解决办法:try--catch--finally结构、throws结构、throw结构。
try--catch--finally结构用来捕获异常,处理异常,
try{
语句块1
}catch(Exception e){
语句块2
}finally{
语句块3
}
执行顺序,先对语句块1操作,有异常执行catch语句块2,没有异常不执行语句块2,最后不论有没有异常执行语句块
3.
public class Test {
public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
try {
int a[] = {1,2,3,6};
System.out.println(a[4]);
String s =null;
s.length();
} catch (RuntimeException re) {
// TODO: handle exception
re.printStackTrace();
}catch(Exception e)
{
e.printStackTrace();
}
catch(Throwable t)
{
t.printStackTrace();
}}}
注意:
可以有多个catch结构,要求是一级比一级大,从子类到父类,printstacktrace方法是用来提示系统报错。
如果遇到错误,下面的语句将不执行。
throws结构:throws 用来抛出异常,不进行捕获处理。
注意:若在本层结构抛出throws异常,需要接着做上级结构抛出异常,直到main方法中抛出,交给系统处理。可以选
择自己处理 try-catch-finally。并且,检测范围是整个方法。
public class ThtowsTest {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
f();
f1();//main方法可以不向系统抛异常,在f1()中对f()进行捕获处理。
}
public static void f() throws Exception
{
System.out.println("dd");
}
public static void f1 ()
{
try {
f();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
throw结构不常用,常与if联用,用来自己制造异常,不抛出,不处理,本身就是个异常。不会主动抛出 也不会主
动处理。人为的抛出 人为的处理。
public class ThrowTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a [] = {1,2,3,4,5};
int i = 100;
if (i==1)
{
try {
System.out.println("出错了!^_^");
throw new Exception("数组越界啦!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(a[i]);
}
}
异常类:
public class MyException extends Exception{
public MyException(String message)
{
super(message);
}
}
import java.text.SimpleDateFormat;
import java.util.Date;
public class StringTools {
public static String getTime(long time) throws MyException
{
if(time<=0)
{
throw new MyException("你丫的系统时间都输成快负的了!");
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd hh:mm:ss");
return sdf.format(new Date(time));
}
}
public class MainTest {
public static void main(String[] args) throws MyException {
// TODO Auto-generated method stub
long l =System.currentTimeMillis();
System.out.println(StringTools.getTime(0));
}
}
Exception in thread "main" com.example.six.MyException: 你丫的系统时间都输成快负的了!
at com.example.six.StringTools.getTime(StringTools.java:11)
at com.example.six.MainTest.main(MainTest.java:9)