- 自动关闭流:JDK1.7后提供的一个新特性
try(
定义需要在finally中调用close()方法关闭的对象.
){
IO操作
}catch(){
...
}
//即:
public static void main(String[] args) {
try (
//try括号只是用来定义的
FileOutputStream fos = new FileOutputStream("111.txt");
){
fos.write(1);
} catch (IOException e) {
e.printStackTrace();
}
/**
* 上述代码事编译器认可的,而不是虚拟机。编译器在编译上述代码后会在编译后的class文件中
改回
*/
}
- finally的执行过程:不管发生什么,包括return;finally最终都会执行
public class FinallyDemo3 {
public static void main(String[] args) {
System.out.println(test("0")+","+test(null)+","+test(""));
//3,3,3
}
public static int test(String str){
try{
System.out.println("执行了一次test方法,参数str:"+str);
return str.charAt(0)-'0';
}catch(NullPointerException e){
System.out.println("出现了空指针!");
return 1;
}catch(Exception e){
System.out.println("出现了其他异常");
return 2;
}finally{
System.out.println("finally的代码执行了!");
return 3;
}
}
}
- 自定义异常
- throw关键字:主动对外抛出一个异常,程序遇到了满足语法,但是不满足业务要求时
/**
* 自定义异常
* 自定义异常通常用来定义那些业务上的问题
* 定义自定义异常需要注意以下问题:
* 1、异常的类命要做到见名知义
* 2、需要是Exception的子类
* 3、提供超类异常提供的所有种类构造器
*
* 年龄不合法异常,当年龄超过了允许范围时会抛出该异常
*/
public class IllegalAgeException extends Exception{
public IllegalAgeException() {
}
public IllegalAgeException(String message) {
super(message);
}
public IllegalAgeException(String message, Throwable cause) {
super(message, cause);
}
public IllegalAgeException(Throwable cause) {
super(cause);
}
public IllegalAgeException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
/**
* 使用当前类测试异常的抛出
*/
public class Persion {
private int age;
public int getAge() {
return age;
}
public void setAge(int age) throws IllegalAgeException {
if(age<0||age>100){
// throw new RuntimeException("年龄不合法");
//RuntimeException 是个例外,如果是别的异常,当我们抛出的时候,方法必须throws通知调用者
throw new IllegalAgeException("年龄不合法");
}
this.age = age;
}
}
public static void main(String[] args) {
Persion p = new Persion();
/**
* 当我们调用一个含有thorws声明异常抛出的方法时,编译器要求我们必须处理这个异常
* ,否则编译不通过
* 处理异常的手段有两种:
* 1、try-catch捕获并处理这个异常
* 2、在当前方法(本案例就是main方法)上继续使用throws声明该异常的抛出给调用者解决
* 具体选取哪种取决于异常处理的责任问题
*
*/
try {
p.setAge(123);
} catch (IllegalAgeException e) {
e.printStackTrace();
}
System.out.println("当前年龄时:"+p.getAge());
}
- 子类在重写超类含有thorws声明的异常抛出方法时对throws的重写规则:
public class Demo4 {
public void dosome()throws IOException, AWTException{
}
}
class subClass extends Demo4 {
/* public void dosome()throws IOException, AWTException{
}*/
//可以不再抛出任何异常
/* public void dosome(){
}*/
//可以抛出部分的
/*public void dosome()throws IOException{
}*/
//可以抛出超类异常的子类的
/* public void dosome()throws FileNotFoundException {
}*/
//不允许抛出额外异常
/*public void dosome()throws SQLException {
}*/
//不允许抛出超类方法抛出异常的超类异常
/*public void dosome()throws Exception {};*/
}
- 异常的常用用法
public class Demo5 {
public static void main(String[] args) {
System.out.println("开始了");
try {
String str = "123./";
System.out.println(Integer.parseInt(str));
} catch (NumberFormatException e) {
e.printStackTrace();//将错误信息输出到控制台 //java.lang.NumberFormatException: For input string: "123./"
System.out.println(e.getMessage());//获取错误消息 //For input string: "123./"
}
System.out.println("结束了");
}
}