17.17static关键字【重点】
指静态资源?= 公共的资源
放在方法区,对象可以调用,但和对象无关
对象.name 但不推荐这么写 一般写 类.name
1.用法
- 修饰成员变量 静态属性
- 修饰成员方法 静态方法
- 修饰代码块 静态代码块
package com.qfedu.a_static;
class Man {
static String name;//静态的属性 和对象无关的
//静态方法
public static void eat () {
System.out.println("吃饭喝酒");
}
//静态代码块
static {
System.out.println("嘻嘻");
}
}
public class Demo1 {
public static void main(String[] args) {
//咋使用 类.静态的属性
Man.name = "狗蛋";
System.out.println(Man.name);
//使用 类.静态方法名字()
Man.eat();
}
}
1.1修饰成员变量
格式:
static 数据类型 变量名;
注意:
- static修饰的成员变量叫静态变量
- static修饰的公共资源当类加载时就会存到方法区,不需要创建对象,所以和对象没关系。
- 可以用 对象.静态属性 访问到资源,但要用 类名.静态属性
1.2修饰成员方法
静态方法
public static 返回值 方法名 (参数列表) { 方法体; }
调用:
类.静态方法名( );
普通方法只能通过new对象后使用**对象.方法名( )**调用,静态方法可以直接通过 类.静态方法名( ) 调用
1.3修饰代码块
静态代码块
static { 语句体; }
注意:
一旦类加载静态代码块就一定会执行,不需要new对象
执行顺序:静态代码块 -->构造代码块 -->构造方法
构造代码块和构造方法必须new对象才会执行
class Cat {
public Cat () {
System.out.println("无参构造方法");
}
{
System.out.println("构造代码块");
}
static {
System.out.println("静态的代码块");
}
}
public class Demo4 {
public static void main(String[] args) {
Cat cat = new Cat();
}
}
//输出顺序为 静态代码块 构造代码块 无参构造方法
17.18异常【重点】
异常,指不能顺利进行下去,出现的一些意外情况
java中:程序自上而下执行时遇到预期外的事件阻止了代码往下运 行,就叫做异常
java封装有很多异常类,并提供了异常的处理机制
文档: https://www.matools.com/api/java8
1.Throwable类(了解)
包括java中所有错误和异常的类,分为以下两个子类:
错误(error):jvm本身错误,无法通过代码解决,无法使用代码修复的问题(了解)
异常(exception):程序运行过程发生僧的不可预期的事件,数组下标越界,类转换异常等,可以通过java抛出让他继续执行下去
构造方法:
Throwable()
构造一个新的可抛出的null
作为其详细信息。
Throwable(String message)
构造一个具有指定的详细消息的新的throwable。
方法:
String
getMessage()
返回此throwable的详细消息字符串。void
printStackTrace()
将此throwable和其追溯打印到标准错误流。String
toString()
返回此可抛出的简短描述。
public class Demo1 {
public static void main(String[] args) {
System.out.println("嘻嘻");
System.err.println("哈哈");
Throwable throwable = new Throwable();
System.out.println(throwable.getMessage());
Throwable throwable2 = new Throwable("哈哈,我傻逼了");
System.out.println(throwable2.getMessage());
/**
* java.lang.Throwable: 哈哈,我傻逼了
at com.qfedu.b_trhowable.Demo1.main(Demo1.java:7)
*/
throwable2.printStackTrace();
//java.lang.Throwable: 哈哈,我傻逼了
//告知了这个错误信息
System.out.println(throwable2.toString());
2.异常【重点】
1.异常种类
1.1编译时异常
无法通过编译,更别说执行了
FileNotFoundException
SQLException
ClassNotFoundException
InterruptException
1.2运行时异常
能够通过编译,但是运行时报错
ArrayIndexOutOfBoundException 数组下标越界
ClassCastException 类转换异常
NullPointerException 空指针异常
2.异常的解决
代码出现异常后,java提供了两种异常的解决方案
异常捕捉 和 异常抛出
2.1异常捕捉
格式:
try { 可能出现异常的代码 }catch(异常对象){ //异常的处理方案 }finally { 语句体 }
finally后无论有无异常均执行,可以不用写(效果相同)
执行:
将可能出现异常的代码放入try后,如果没有出现异常,这正常执行try后代码,如果出现异常,则和catch后的异常对象相匹配,相同的话执行相应的异常处理方案。可以有多个catch,利用多态性异常对象可以写exception,不用写多个catch。
package com.qfedu.c_Exception;
public class Demo2 {
public static void main(String[] args) {
test(3, 0);
}
public static void test (int a, int b) {
int ret = 0;
try {
//有可能个出现异常的代码
ret = a / b;
} catch (ArithmeticException e) {
System.out.println("123");
//打印错误信息
System.out.println(e.getMessage());
}
//即使代码有异常,通过捕捉以后。是不会影响程序的接着执行的代码的
System.out.println(ret);
System.out.println( 4 + 4);
}
}
2.2异常抛出
在代码出现异常的地方进行异常抛出
异常抛出后代码会终止
关键字:
throw:在方法中抛出一个异常,自己造出来的错
throws:写在方法声明处,告知调用者此处有异常,要小心
package com.qfedu.c_Exception;
import java.io.FileNotFoundException;
public class Demo8 {
public static void main(String[] args) throws Exception{
test(0);
Thread.sleep(1000);
}
public static void test (int a) throws FileNotFoundException{
if (a == 0) {
//编译时异常
throw new FileNotFoundException();
}
System.out.println("jvm xixi");
}
}
目前暂时会 怎么捕捉异常或抛出异常 就可以
3.自定义异常
java所提供的的异常对象无法满足我们现实生活中的需求,就需要我们自己造一个异常对象
这个异常类要继承Exception
例:如果单身就抛出一个异常 单身异常类
package com.qfedu.c_Exception;
import java.util.Scanner;
public class Demo11 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个整数:");
int score = scanner.nextInt();
try {
test(score);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
public static void test (int score) throws Exception {
if (score > 100 || score < 0) {
throw new Exception("输入的整数有误的。。。");
}
if (score >= 90 && score <= 100) {
System.out.println("优秀");
} else if (score >= 80) {
System.out.println("良好");
} else if (score >= 70) {
System.out.println("及格");
} else {
System.out.println("叫家长。。。");
}
}
}