异常:
1.异常并非错误
2.异常关键词:try、catch、finally、throw、throws
3.try的代码块中放可能会出异常的代码,catch中放置出现异常后如何处理的代码,finally中放置一定需要执行的代码。
4.程序如果出现异常则必须捕获异常后才能继续执行,否则会报错而终止。
5.catch可以多重包裹,因为有些异常会无法被catch1捕获,但我们可以用catch2...catchN来捕获,Exception可以捕获所有异常。
6.一个异常被捕获一次后,不会再次被捕获
7.try-catch可以多层嵌套,如果内部的try出现异常但内部catch无法捕获当前异常,则不会继续执行内部的代码,异常会在外层进行捕获,捕获后不会再执行内部包裹的代码(finally包裹除外)。
8.throw引发异常,throws抛出异常
9.程序运行时遭遇意料之外的情况就是异常
10.异常可以自行定义,定义后可以用 throw new 异常类的名称 这个语式进行使用
11.throws只能向上抛出,如果在main方法中没有进行异常处理继续抛出,最后的异常会到JVM(Java虚拟机)中进行处理
今天学习的是异常与异常处理,没什么好说的,直接上几个题目的源码(本人懒)。
1.计算圆的面积,半径不能为零和负数
package demo01;
import java.util.Scanner;
public class Circle {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("输入圆的半径计算这个圆的面积:");double r=sc.nextDouble();
if (r == 0||r<0) {
try {
throw new MyExecption("这里TM不能输入0跟负数!");
} catch (MyExecption myExecption) {
myExecption.printStackTrace();
}
}else {
System.out.println("这个圆的面积为:"+r*r*Math.PI);
}
}
}
2.求平均数,参数不能为负数
package demo02;
import demo01.MyExecption;
import java.util.Scanner;
public class Mean {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("输入两个值:");
double num=sc.nextDouble();
double num2=sc.nextDouble();
if (num<0||num<0) {
try {
throw new demo01.MyExecption("这里TM不能输入负数!");
} catch (MyExecption myExecption) {
myExecption.printStackTrace();
}
}else {
System.out.println("这两个数的平均值为:"+((num+num2)/2));
}
}
}
3.检测年龄不能为负数和大于200岁
package demo03;
import demo01.MyExecption;
import java.util.Scanner;
public class Age {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.print("输入两个年龄:");
double num=sc.nextDouble();
double num2=sc.nextDouble();
if (num<0||num<0) {
try {
throw new demo01.MyExecption("这里TM不能输入负数!");
} catch (MyExecption myExecption) {
myExecption.printStackTrace();
}
}else {
if (num+num2>200){
try {
throw new demo03.MyExecption("年龄加起来不能超过200岁!!!");
} catch (demo03.MyExecption myExecption) {
myExecption.printStackTrace();
}
}
System.out.println("年龄加起来为:"+(num+num2));
}
}
}
4.从命令行得到5个整数,放入一整型数组,然后打印输出,要求:如果输入数据pi为整数,要捕获Integer.parseInt()产生的异常,显示“请输入整数”,捕获输入参数pi足5个的异常(数组越界)。显示"请输入至少5个整数"
package demo04;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int[] nums=new int[5];
for (int i = 0; i < nums.length; i++) {
try {
System.out.println("请输入整数类型:(输入0结束)");String num=sc.next();
nums[i]=Integer.parseInt(num);
if (num.equals("0")||num.equals("0")) break;
}catch (NumberFormatException e){
System.out.println("请输入整数!");
}finally {
}
}
for (int i = 0; i <nums.length ; i++) {
if (nums[i]==0){
throw new MyExecption("数组越界");
};
}
}
}
5.写一个方法void sanjiao(int a,int b,int c),判断三个参数是否能构成一个三角形,如果pi能则抛出异常IllegalArgumentException,显示异常信息a,b,c+"pi能构成三角形,如果可以构成则显示三角形三个边长,在主方法中得到命令行输入的三个整数。调用此方法,并捕获异常。
package demo05;
public class Triangle {
public static void main(String[] args) {
System.out.println( sanjiao(7,5,3));
}
static String sanjiao(int a,int b,int c){
String msg="这三个值无法构成三角形";
int[] nums={a,b,c};
int max=0;
int num=0;
for (int i = 0; i <nums.length ; i++) {
max=Math.max(max,nums[i]);
}
for (int i = 0; i <nums.length ; i++) {
if (nums[i]<max) {
num+=nums[i];
}
}
if (num>max) msg="这三个值,可以构成三角形,三个边为:"+a+"、"+b+"、"+c+"最长的边为:"+max;
return msg;
}
}
6.自定义方法sanj,其中有成员x,y,z作为三边长,构造方法sanj(a,b,c)分别给x,y,z赋值,方法求面积getarea和显示三角形信息(三个边长)showInfo,这2个方法中当三条边能构成一个三角形时要抛出自定义异常notsanjiaowxception,否则显示正确信息。在另外一个类中的方法中构造一个sanj对象(三边为命令行输入的三个整数),显示三角形信息和面积,要求捕获异常。
package demo06;
import demo04.MyExecption;
public class Sanj {
double x;
double y;
double z;
public Sanj(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
double getArea(){
System.out.println(p());
return Math.sqrt(p()*(p()-x)*(p()-y)*(p()-z));
}
double p(){
return (x+y+z)/2;
}
String showInfo(){
if (tf()==false) throw new MyExecption("符合要求!报错!");
return "面积为:"+getArea();
}
boolean tf(){
boolean pd=false;
double[] nums={x,y,z};
double max=0;
double num=0;
for (int i = 0; i <nums.length ; i++) {
max=Math.max(max,nums[i]);
}
for (int i = 0; i <nums.length ; i++) {
if (nums[i]<max) num+=nums[i];
}
if (num>max) pd=true;
return pd;
}
}
package demo06;
public class Test {
public static void main(String[] args) {
Sanj sj=new Sanj(7,3,5);
System.out.println(sj.showInfo());
}
}
这些题只是一些逻辑题要求掺杂一些异常的处理方式,所以没什么好说的。
今天的题比昨天少好多啊,果然还是跟讲的内容有关系,讲的越重要,题就越多。到后面的题我都不敢想。。。干脆摆烂吧。