简单错误避免
在平常的编程中,出现的各类错误都会直接显示出来。
在IDEA中,错误的语句会被标红或者会出现红色的波浪线来提示你这里出现了错误;而如果有推荐修改的地方,会出现暗黄色的框来表明。
但是,在我们引入了输入输出操作和类之后,很容易出现一些不会被报错的bug,我将其分为逻辑错误和输入错误,下面讲介绍这两种错误以及避免他们的方式
逻辑错误避免
逻辑错误指的是虽然整体运行不会报错,但是从逻辑上来看不合理,让我们用之前的Person类举个例子,Person类中有int类型的参数age,在赋值时,你可以任意给age赋值,比如:
age = 10000;
age = -10;
虽然整体运行看来不会有任何问题,但是从逻辑上来看人类的年龄不能为10000更不能为-10,所以我们需要通过逻辑判断修正这一现象
if (age < 0 || age > 200) {
System.out.println("输入错误");
}
else {
System.out.println("输入成功");
}
通过上述代码,就能很好的解决逻辑错误
输入错误避免
输入错误指的是在有输入操作情况下,输入错误,比如你定义了一个int类型的变量,但是你在输入时输入了一个String类型的值
Scanner scanner = new Scanner(System.in);
int age = scanner.nextInt();
运行结果:
abc
Exception in thread "main" java.util.InputMismatchException
at java.base/java.util.Scanner.throwFor(Scanner.java:939)
at java.base/java.util.Scanner.next(Scanner.java:1594)
at java.base/java.util.Scanner.nextInt(Scanner.java:2258)
at java.base/java.util.Scanner.nextInt(Scanner.java:2212)
此时就会发生报错,且程序直接停止运行,此时我们可以用Scanner类中带有的方法.hasNext来验证(在输入语句的next前面加has并把next的n换为大写的N),在接受数据前先进行判断,如果输入正确才接受该数据
Scanner scanner = new Scanner(System.in);
int age;
if (scanner.hasNextInt()) {
age = scanner.nextInt();
System.out.println("输入成功");
}
else {
System.out.println("输入错误");
}
运行结果:
abc
输入错误
Process finished with exit code 0
此方法应用于简单回避输入错误很有效,在之后我们会讲解更高级也更复杂的try-catch方法
权限修饰符
权限修饰符可以用于形容所有需要访问的资源,比如类中的属性,类中的方法等等都可以使用修饰符去修饰,经过修饰后,该资源就会被添加上访问权限。
权限修饰符可以通过如下方式使用
public class ForAll{
private int i;
protected void guard(){}
}
在我们最早的Hello World程序中就使用了一个权限修饰符public,除了public之外,还有三个基础的权限修饰符protected,default,和private,他们之间的区别如下表所示
修饰符 | 类 | 包 | 子类 | 其他包 |
---|---|---|---|---|
public | √ | √ | √ | √ |
protected | √ | √ | √ | × |
default | √ | √ | × | × |
private | √ | × | × | × |
可以看出public给的权限最大,protected则是禁止了跨包访问,default即为什么都不加,默认,就是仅能让类和包访问,private则将资源限定在类中。
这里让我们理解一下包的概念,包其实就是一个文件夹,通常功能相似或者相关的类或接口会被放在一个包中,方便归类和查找。
包的名字通常需要全小写,包与包之间用英文的.来隔开,同一个包中类的名字不能相同,在不同包中可以拥有相同名字的类,在部分公司里要求把所有程序放在有公司域名的包中,如com.java.xxx
我们之前引入的Scanner类,使用了代码:
import java.util.Scanner;
其中import表示引用,java就是最大的包,util是java中的一个包,Scanner就是util中的一个类文件。
(父类和子类的概念将会在之后小节中详细阐述,其中涉及到extends和implements的使用)
main方法详解
现在让我们再回到最开始的Hello World程序
public class HelloWorld {
public static void main(String[] args){
System.out.println("Hello World");
}
}
可以注意到我们现在已经学会了public,class,static(在类的存储中讲过static可被视为优先读取),void的用法以及意义,只剩一个main方法不知其意,现在就让我们详细了解一下main方法
首先,main方法是一个系统规定的方法名称,如果public类中缺失main,程序会报错
而其中的args数组,是用来接收参数的,你可以实验如下代码:
public class OOPAdvanced {
public static void main(String[] args) {
for(int i = 0; i < args.length; i++)
System.out.println(args[i]);
}
}
运行结果:
Process finished with exit code 0
你会发现什么都没有输出,因为args在没有参数时是一个长度为0的数组,在执行java命令时传入的参数会被存入args数组中。