异常: 程序即便写的很完美,也会由于用户的输入格式问题,文件路径问题,网络中断问题 导致运行期间出现一些异常,导致jvm非正常停止,程序终止 异常的抛出机制: java中将可能出现的每一种异常,都封装成了一个个的类,当出现某种异常时,虚拟机会抛出对应的类的对象 程序员可以根据不同的类型来进行处理 如果不处理,虚拟机就会停止工作,程序终止 异常的抛出机制: 1.不管不顾,程序停止 2.在写程序的时候,把可能出现的异常的处理机制也写好,一旦发生异常就可以使用处理机制进行处理
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class Demo1 {
/*
异常:
程序即便写的很完美,也会由于用户的输入格式问题,文件路径问题,网络中断问题
导致运行期间出现一些异常,导致jvm非正常停止,程序终止
异常的抛出机制:
java中将可能出现的每一种异常,都封装成了一个个的类,当出现某种异常时,虚拟机会抛出对应的类的对象,
程序员可以根据不同的类型来进行处理
如果不处理,虚拟机就会停止工作,程序终止
异常的抛出机制:
1.不管不顾,程序停止
2.在写程序的时候,把可能出现的异常的处理机制也写好,一旦发生异常就可以使用处理机制进行处理
*/
public static void main(String[] args) throws FileNotFoundException {
//Integer a = new Integer("a");//java.lang.NumberFormatException 数字转换格式异常
int b = Integer.parseInt("10");
System.out.println(b);
int c = 10;
int d = 0;
System.out.println(c/d);//java.lang.ArithmeticException 算数异常
System.out.println("除数不能为0");
// 当程序中出现异常时,程序终止,下面的程序无法继续运行
new FileInputStream("D:/d.txt");
//文件目录损坏 或者被删除
Object x = new Integer("0");
System.out.println((String) x);
//格式转换错误 java.lang.ClassCastException
String s = "abcdefg";
System.out.println(s.charAt(20));
//java.lang.StringIndexOutOfBoundsException
}
}
广义上的异常(Throwable)包括Error和Exception
Error java.lang.OutOfMemoryError 内存溢出错误 程序无法解决 java.lang.StackOverflowError 栈溢出错误 程序无法解决
而Exception有编译期异常和运行期异常(RuntimeException)
编译期异常在编译期间就会提示报错,但是运行期异常只有在运行期间才会报错,编译期间不会提示
而运行期异常里边包括很多类异常
算数异常
ArithmeticException
是在计算遇到问题时
编码转换异常
unsupportEncodingException
是在编码时,例如utf-8与utf-811("abc".getBytes)
格式化转换异常
NumberFormatException
是在格式化日期出现异常
文件查找异常
FileNotFoundException
在查找文件路径,文件被删除或者移动
索引异常
(数据类型)IndexOutOfBoundsException
是在超出数据范围的查找时
空指针异常
NullPointerException
是在栈中创建的对象为null时,引用变量指向的对象为空
public class Demo4 {
public static void main(String[] args) {
/*
异常处理机制:
在写代码时,需要编写相应地异常处理程序,一旦程序运行时出现异常,就可以执行处理异常的程序代码
处理完成后,后面的代码可以继续执行
注意:异常处理,在发生不正常情况下保证程序可以正常执行的机制,而不是将异常代码改好
*/
int a = 10;
int b = 0;
try {
int c = a/b;
//此处是判定可能会出现异常的的代码
}catch (ArithmeticException ar){//此处是相应的异常类型捕获
System.out.println("除数不能为0!");
}
catch (NumberFormatException nu){
System.out.println("格式化日期错误");
nu.printStackTrace();//方便在开发编写调试过程中程序员明白异常的地方在哪 所以打印在控制台内,以后会打印在日志中方便查找
}
System.out.println("后续代码");
}
}
import java.io.UnsupportedEncodingException;
public class Demo7 {
public static void main(String[] args) {
try {
test();
} catch (UnsupportedEncodingException e) {
System.out.println("葫芦娃之火娃");
e.printStackTrace();
}
try {
test1();
} catch (ArithmeticException e) {
System.out.println();
e.printStackTrace();
}
System.out.println("爷爷爷爷,我来救你啦");
}
public static void test() throws UnsupportedEncodingException {
"abc".getBytes("utf-811");
}
public static void test1() throws ArithmeticException{
int a = 10;
int b = 0;
int c = a/b;
}
}
而这里边涉及到了异常的捕获处理
用到的就是try{}catch{}方法
try{ 可能会出现异常的代码 可能会出现多个异常 }catch(要捕获的异常类型1){ 写针对出现的异常要处理的代码。例如:对用户做出一个提示 }}catch(要捕获的异常类型2){ 写针对出现的异常要处理的代码。例如:对用户做出一个提示 }}catch(要捕获的异常类型n){ 写针对出现的异常要处理的代码。例如:对用户做出一个提示 }finally{ finally中代码块的内容,无论是否出现异常,都会被执行 }
public class Demo5 {
public static void main(String[] args) {
/*
异常处理机制:
在写代码时,需要编写相应地异常处理程序,一旦程序运行时出现异常,就可以执行处理异常的程序代码
处理完成后,后面的代码可以继续执行
注意:异常处理,在发生不正常情况下保证程序可以正常执行的机制,而不是将异常代码改好
*/
try {
int a = Integer.parseInt("10");
int b = 0;
int c = a/b;
//此处是判定可能会出现异常的的代码
}catch (ArithmeticException ar){//此处是相应的异常类型捕获
System.out.println("除数不能为0!");
ar.printStackTrace();//此处的作用是方便开发人员了解异常发生的具体代码
} catch (NumberFormatException nu){
System.out.println("格式化日期错误");
nu.printStackTrace();//打印
}finally {
System.out.println("finally 代码块");
//无论程序异常与否都要输出执行的一段代码
}
System.out.println("后续代码");
}
}
这里不得不提到异常的抛出
throws 是声明该方法可能会出现异常,并且对该异常不做处理 谁要调用,谁处理 throw 不满足条件时,主动的在程序中使用throw关键字抛出一个异常对象,发生了异常
public class Demo8 {
public static void main(String[] args) {
//System.out.println(10/0);
char c = 0;
try {
c = myCharAt(-1,"abcdefg");
} catch (StringIndexOutOfBoundsException e) {
e.printStackTrace();
System.out.println(e.getMessage());
}
System.out.println(c);
}
public static char myCharAt(int index,String s)throws StringIndexOutOfBoundsException{
if(index<0||index>=s.length()){
//不满足条件时,主动的在程序中使用throw关键字抛出一个异常对象,发生了异常
throw new StringIndexOutOfBoundsException("非法索引");
}
return s.charAt(index);
}
}
自定义异常类就是自己创建一个异常,用于自己设计的具体的程序