在使用计算机语育进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式,读取文件是否存在,网络是否始终保持通畅等等。
package com.dreamcold.exception;
public class Demo01 {
public static void main(String[] args) {
main(args);
}
}
结果
一直递归调用,而不弹栈,就会导致栈的溢出错误
package com.dreamcold.exception;
public class Demo01 {
public static void main(String[] args) {
int[] arr=new int[1024*1024*1024];
}
}
结果:new关键字申请内存在堆中,堆中没有那么多的内存,内存不够,简称OOM
package com.dreamcold.exception;
public class Demo02 {
public static void main(String[] args) {
int[] arr=null;
System.out.println(arr[3]);
}
}
结果:
package com.dreamcold.exception;
public class Demo02 {
public static void main(String[] args) {
int[] arr=new int[10];
System.out.println(arr[10]);
}
}
结果
package com.dreamcold.exception;
import java.util.Date;
public class Demo02 {
public static void main(String[] args) {
Object date=new Date();
String str=(String)date;
}
}
结果
package com.dreamcold.exception;
import java.util.Date;
public class Demo02 {
public static void main(String[] args) {
String numbers="abcdefg";
Integer i=Integer.parseInt(numbers);
}
}
结果
package com.dreamcold.exception;
import java.util.Date;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int a=scanner.nextInt();
System.out.println(a);
}
}
测试结果:
package com.dreamcold.exception;
import java.util.Date;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
int a=10;
int b=0;
System.out.println(a/b);
}
}
结果
比如我们逐个字符读取文件的例子
package com.dreamcold.exception;
import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
File file=new File("hello.txt");
FileInputStream fs=new FileInputStream(file);
int data=fs.read();
while (data!=-1){
System.out.println((char)data);
data=fs.read();
}
fs.close();
}
}
编译器提示我们没有处理对应的IOException
在编写程序时,经常要在可能出现错误的地方加上检测的代码,如进行x/y运算时, 要检测分母为0,数据为空,输入的不是数据而是字符等。过多的if-else分支会导致程序的代码加长、臃肿,可读性差。因此采用异常处理机制。
Java异常处理
Java采用的异常处理机制,是将异常处理的程序代码集中在一起.与正常的程序代码分开,使得程序简洁、优雅,并易于维护。
异常处理设计抓抛模型:
格式
try{
//可能出现异常的代码
}catch(异常类型1 变量名1){
//处理异常的方式1
}catch(异常类型2 变量名2){
//处理异常的方式2
}catch(异常类型3 变量名3){
//处理异常的方式3
}finally{
//一定会执行的代码
}
代码示例1
package com.dreamcold.exception;
import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
String str="abc";
try{
int a=Integer.parseInt(str);
System.out.println("发生异常的后的第一行代码");
}catch (NumberFormatException e){
System.out.println("遇到数字格式异常...");
}
System.out.println("处理完结束的代码");
}
}
结果
示例二
package com.dreamcold.exception;
import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
String str="abc";
try{
int a=Integer.parseInt(str);
System.out.println("发生异常的后的第一行代码");
}catch (NullPointerException e){
System.out.println("遇到空指针格式异常...");
}
System.out.println("处理完结束的代码");
}
}
结果:异常类型不匹配,会导致无法捕获对应的异常进行处理
修改上述代码为
package com.dreamcold.exception;
import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
String str="abc";
try{
int a=Integer.parseInt(str);
System.out.println("发生异常的后的第一行代码");
}catch (NullPointerException e){
System.out.println("遇到空指针格式异常...");
}catch (NumberFormatException e){
System.out.println("遇到数字格式异常...");
}
System.out.println("处理完结束的代码");
}
}
结果
示例三:
package com.dreamcold.exception;
import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
String str="abc";
try{
int a=Integer.parseInt(str);
System.out.println("发生异常的后的第一行代码");
}catch (NullPointerException e){
System.out.println("遇到空指针格式异常...");
}catch (NumberFormatException e){
System.out.println("遇到数字格式异常...");
}catch (Exception e){
System.out.println("发生了异常");
}
System.out.println("处理完结束的代码");
}
}
结果
示例四:
package com.dreamcold.exception;
import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
String str="abc";
try{
int a=Integer.parseInt(str);
System.out.println("发生异常的后的第一行代码");
}catch (NullPointerException e){
System.out.println("遇到空指针格式异常...");
}catch (NumberFormatException e){
System.out.println(e.getMessage());
// System.out.println("遇到数字格式异常...");
}catch (Exception e){
System.out.println("发生了异常");
}
System.out.println("处理完结束的代码");
}
}
结果
示例五:
package com.dreamcold.exception;
import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
String str="abc";
try{
int a=Integer.parseInt(str);
System.out.println("发生异常的后的第一行代码");
}catch (NullPointerException e){
System.out.println("遇到空指针格式异常...");
}catch (NumberFormatException e){
// System.out.println(e.getMessage());
// System.out.println("遇到数字格式异常...");
e.printStackTrace();
}catch (Exception e){
System.out.println("发生了异常");
}
System.out.println("处理完结束的代码");
}
}
结果
示例六
离开try大括号是无法访问到定义的变量a的
推荐写法
package com.dreamcold.exception;
import java.io.File;
import java.io.FileInputStream;
import java.util.Date;
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
String str="abc";
int a=0;
try{
a=Integer.parseInt(str);
System.out.println("发生异常的后的第一行代码");
}catch (NullPointerException e){
System.out.println("遇到空指针格式异常...");
}catch (NumberFormatException e){
// System.out.println(e.getMessage());
// System.out.println("遇到数字格式异常...");
e.printStackTrace();
}catch (Exception e){
System.out.println("发生了异常");
}
System.out.println(a);
System.out.println("处理完结束的代码");
}
}
结果
说明:
示例1
package com.dreamcold.exception;
public class Demo03 {
public static void main(String[] args) {
try{
int a=10;
int b=0;
System.out.println(a/b);
}catch (ArithmeticException e){
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("finally....");
}
}
}
结果
示例二
package com.dreamcold.exception;
public class Demo03 {
public static void main(String[] args) {
try{
int a=10;
int b=0;
System.out.println(a/b);
}catch (ArithmeticException e){
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
}
System.out.println("finally...");
}
}
结果
示例三:
package com.dreamcold.exception;
public class Demo03 {
public static void main(String[] args) {
try{
int a=10;
int b=0;
System.out.println(a/b);
}catch (ArithmeticException e){
e.printStackTrace();
int[] arr=new int[10];
System.out.println(arr[10]);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("finally...");
}
}
结果
示例四
package com.dreamcold.exception;
public class Demo03 {
public static void main(String[] args) {
try{
int a=10;
int b=0;
System.out.println(a/b);
}catch (ArithmeticException e){
e.printStackTrace();
int[] arr=new int[10];
System.out.println(arr[10]);
}catch (Exception e){
e.printStackTrace();
}finally {
System.out.println("finally...");
}
}
}
结果
示例五
package com.dreamcold.exception;
public class Demo03 {
public static void main(String[] args) {
int num=test();
System.out.println(num);
}
public static int test(){
try{
int[] arr=new int[10];
System.out.println(arr[10]);
return 1;
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
return 2;
}finally {
System.out.println("finally...");
return 3;
}
}
}
结果
示例六
package com.dreamcold.exception;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo03 {
public static void main(String[] args) {
FileInputStream fis=null;
try {
File file=new File("Hello.txt");
fis=new FileInputStream(file);
int data=fis.read();
while (data!=-1){
System.out.println((char)data);
data=fis.read();
}
}catch (FileNotFoundException e){
e.printStackTrace();
}catch (IOException e){
e.printStackTrace();
}finally {
try {
if(fis!=null){
fis.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
}
结果
异常处理方式二,throws+异常类型
示例1
package com.dreamcold.exception;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo04 {
public static void main(String[] args) throws FileNotFoundException,IOException {
FileInputStream fis=null;
File file=new File("Hello.txt");
fis=new FileInputStream(file);
int data=fis.read();
while (data!=-1){
System.out.println((char)data);
data=fis.read();
}
fis.close();
}
}
示例二
package com.dreamcold.exception;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo04 {
public static void main(String[] args) {
try {
method();
}catch (IOException e){
e.printStackTrace();
}
}
public static void method1(){
try{
test();
}catch (IOException e){
e.printStackTrace();
}
}
public static void method() throws FileNotFoundException,IOException{
test();
}
public static void test() throws FileNotFoundException,IOException{
FileInputStream fis=null;
File file=new File("Hello.txt");
fis=new FileInputStream(file);
int data=fis.read();
while (data!=-1){
System.out.println((char)data);
data=fis.read();
}
fis.close();
}
}
示例三
package com.dreamcold.exception;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo05 {
public static void main(String[] args) {
SuperClass superClass=new SubClass();
display(superClass);
}
public static void display(SuperClass superClass){
try {
superClass.method();
} catch (IOException e) {
e.printStackTrace();
}
}
}
class SuperClass{
public void method() throws IOException{
}
}
class SubClass extends SuperClass{
public void method() throws FileNotFoundException{
}
}
示例四
过程一:抛的过程,程序在正常执行的过程中,一旦出现异常的话,就会在异常的代码处生成一个对弈的异常的对象,并将此对象进行抛出,一旦抛出对象后其后的代码就不再执行
关于对象的产生:
示例1
package com.dreamcold.exception;
public class Demo06 {
public static void main(String[] args) {
Student student=new Student();
try {
student.regist(-100);
}catch (RuntimeException e){
e.printStackTrace();
}
}
}
class Student{
private int id;
public void regist(int id){
if(id>0){
this.id=id;
}else {
throw new RuntimeException("参数格式不对");
}
}
}
结果
示例1
package com.dreamcold.exception;
public class MyException extends RuntimeException {
static final long serialVersionUID = -7034897190745766939L;
public MyException() {
super();
}
public MyException(String message) {
super(message);
}
}
package com.dreamcold.exception;
public class Demo06 {
public static void main(String[] args) {
Student student=new Student();
try {
student.regist(-100);
}catch (RuntimeException e){
e.printStackTrace();
}
}
}
class Student{
private int id;
public void regist(int id){
if(id>0){
this.id=id;
}else {
throw new MyException("参数格式不对!");
}
}
}
原文:https://www.cnblogs.com/mengxiaoleng/p/14759068.html