捕获异常
try{
A
B
}catch(Exception e){
异常处理
}
C
try:尝试,
catch:捕获; 尝试执行
代码A和
代码B如果这两段代码有一个出现了异常,就会执行
catch中的语句,如果
代码A、B都不存在异常就不会执行
catch代码,最后继续执行
代码C
本关任务:捕获程序的异常,输出异常处理的结果
package step2;
import java.util.Scanner;
public class Task {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int num1 = sc.nextInt();
int num2 = sc.nextInt();
/********* Begin *********/
try{
System.out.println(num1/num2);
}catch(Exception e){
System.out.print("除数不能为0");
}
/********* End *********/
}
}
抛出异常
throw 关键字
throw关键字的作用是:主动抛出异常
throw
是语句抛出一个异常,一般是在代码块的内部,当程序出现某种逻辑错误时由程序员主动抛出某种特定类型的异常。
注意:使用throw
关键字主动抛出检测性异常的时候,在方法名上必须使用throws
表明调用这个方法可能存在要抛出的异常。
//方法一
package step3;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException; //方法一
public class Task { //方法二在下面
/********* Begin *********/
//请在合适的部位添加代码
public static void main(String[] args) throws FileNotFoundException{
test();
}
public static void test() throws FileNotFoundException {
File file = new File("abc");
if(!file.exists()){ //判断文件是否存在
//文件不存在,则 抛出 文件不存在异常
throw new FileNotFoundException("该文件不存在");
}else{
FileInputStream fs = new FileInputStream(file);
}
}
/********* End *********/
}
//方法二:
public class Task {
/********* Begin *********/
//请在合适的部位添加代码
public static void main(String[] args) {
try{
test();
}catch(FileNotFoundException e){
e.printStackTrace();
System.out.println("该文件不存在");
}
}
public static void test() throws FileNotFoundException {
File file = new File("abc");
if(!file.exists()){ //判断文件是否存在
//文件不存在,则 抛出 文件不存在异常
throw new FileNotFoundException("该文件不存在");
}else{
FileInputStream fs = new FileInputStream(file);
}
}
/********* End *********/
}
自定义异常
前面谈到的都是系统自带的异常,但是如果我们是在开发一个复杂项目,就经常会遇到系统自带的异常不能满足我们的需求的情况,所以这个时候就需要我们自己来定义异常了
使用自定义异常
很简单,我们只需要继承Exception
,再将信息传递给父类就可以了:
package step4;
import java.util.Scanner;
public class Task {
/********* Begin *********/
public static void main(String[] args) throws MyException{
Scanner sc = new Scanner(System.in);
String username = sc.next();
//判断用户名
if(username.length()<3){
throw new MyException();
}else
System.out.print("用户名格式正确");
}
}
class MyException extends Exception{ //自定义异常继承Exception
private static final long serialVersionUID=1L;
public MyException(){
super("用户名小于三位Exception"); //抛出MyException时显示...
}
public MyException(String msg){
super(msg);
}
}
/********* End *********/
自定义异常及处理
package step5;
import java.io.*;
//用户定义的异常类UnSafePasswordException,由Exception类派生,补充完善代码
//begin
class UnSafePasswordException extends Exception {
private static final long serialVersionUID = 1L;
public UnSafePasswordException() {
//调用父类Exception的构造方法,并设置异常信息为"密码过于简单,安全密码的长度应大于6,且必须包含数字、大写字符和小写字母!"
super("密码过于简单,安全密码的长度应大于6,且必须包含数字、大写字符和小写字母!");
}
public UnSafePasswordException(String msg) {
super(msg);
//调用父类Exception的构造方法
}
}
//end
public class ExceptionTest06Step {
// 密码检查方法checkPassword需要抛出异常UnSafePasswordException,补充完善代码
//begin
static void checkPassword(String strPassword) throws UnSafePasswordException{ //throws放在方法名
if (strPassword.length() < 6)
throw new UnSafePasswordException("密码长度太短!");//补充抛出异常代码
boolean bNumber = false;
boolean bUpper = false;
boolean bLower = false;
for (int i = 0; i < strPassword.length(); i++) {
if (bUpper && bLower && bNumber)
break;
if (strPassword.charAt(i) >= 'a' && strPassword.charAt(i) <= 'z')
bLower = true;
if (strPassword.charAt(i) >= 'A' && strPassword.charAt(i) <= 'Z')
bUpper = true;
if (strPassword.charAt(i) >= '0' && strPassword.charAt(i) <= '9')
bNumber = true;
}
if (bUpper && bLower && bNumber) {
System.out.println("密码是安全的!");
return;
} else {
throw new UnSafePasswordException("密码太简单!密码必须同时有大小写字母和数字!");//补充抛出异常代码
}
}
//end
public static void main(String args[]) {
//异常捕获和处理,请补充完善代码
try{
//System.out.println("请输入密码: ");
BufferedReader stdin = new BufferedReader(new InputStreamReader(
System.in));
checkPassword(stdin.readLine());
} catch (UnSafePasswordException e ) { //抛出自定义异常
System.out.println(e.getMessage());
} catch (Exception e) { //抛出系统异常
//System.out.println(e.getMessage());
System.out.println("发生一般的异常!");
}
}
}