Head First Java 读书笔记

第11章:异常处理

如果你把有风险的程序代码包含在 try/catch 块中,那么编译器会放心很多。 try/catch 块会告诉编译器你确实知道所调用的方法会有风险,并且也已经准备好要处理它。

try {
// 有风险的行为
Sequencer seq = MidiSystem.getSequencer();
System.out.println("had got a sequencer");
} catch (MidiUnavailableException ex) {
System.out.println(ex);
} finally {
System.out.println("总会被执行!");
}

异常也是多态的,Exception子类的实例对象,都是 Exception类型的。编译器会忽略 RuntimeException类型的异常,RuntimeException类型的异常不需要声明或被包含在 try/catch 块中。

如果 try 或 catch 块中有 return 指令,finally还是会执行。流程会跳到 finally执行,finally执行完毕后再回跳到return 指令。

如何处理多重异常?

class Laundry {
public void doLaundry() throws PantsException, LingerieException {}
}

public class HandleException {
public void go() {
Laundry lau = new Laundry();
try {
lau.doLaundry();
} catch (PantsException e) {
System.out.print(e);
} catch (LingerieException e) {
System.out.print(e);
} finally {
}
}
}

如果有必要的话,方法可以抛出多个异常。但该方法的声明必须要有含有全部可能的检查异常(如果两个或两个以上的异常有共同的父类时,可以只声明该父类就行)。

有多重异常需要捕获时,异常要根据继承关系从小到大排列,如果更高一级的异常排在了前面,将会导致低一级的异常将没有机会被使用。同级别的异常,排列顺序无所谓。

异常从哪里来?

异常是由方法 throws 来的。

public void doLaundry() throws PantsException, LingerieException {}

如果你调用了一个有风险的方法,但你又不想 try/catch捕获时怎么办?你可以继续使用 throws 关键字,把异常抛给下一个调用我的人,这好比是在踢皮球哈哈。

从上面看,程序有两种方式来处理异常,一种是使用 try/catch 来捕获异常,另一种是使用 throws 把异常抛给下一个调用者。

 

第12章:图形用户接口

什么是 JFrame ?

JFrame 是个代表屏幕上的window对象。你可以把 button / text / checkbox 等 widget 接口放在 window上面。

如何编写第一个 GUI 程序?

public class TestGui implements ActionListener {
JButton btn;
void init() {
// 创建 frame
JFrame frame = new JFrame();
// 当window关闭时,把程序结束掉
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建 widget
btn = new JButton("click me");
// 给btn 注册事件
btn.addActionListener(this);
// 把 btn添加到 frame上
frame.getContentPane().add(btn);
// 显示
frame.setSize(300, 300);
frame.setVisible(true);
}
// 覆写 ActionListener接口的中的方法
@Override
public void actionPerformed(ActionEvent event) {
btn.setText("I've been clicked.");
}
public static void main(String[] args) {
TestGui tg = new TestGui();
tg.init();
}
}

图形界面中,事件三要素:事件源、监听、事件对象。其中,事件对象携带着事件的详细信息。

1.在 frame上放置 widget。javax.swing这个包中有很多 widget组件可以用。

2.在 frame上绘制 2D图形。使用 graphics 对象来绘制 2D 图形。

3.在 widget上绘制 jpeg图片。 graphics.drawImage(img, 10, 10, this);

如何自定义 widget 组件?

继承 JPanel ,并覆写 paintComponent()这个方法。

public class CustomComponent extends JPanel {
// 覆写方法
public void paintComponent(Graphics g) {
// 绘制矩形
g.setColor(Color.orange);
g.fillRect(20, 50, 100, 100);

// 绘制图像
Image img = new ImageIcon("./car.png").getImage();
System.out.println(img);
g.drawImage(img, 3, 4, this);

// 绘制矩形
g.fillRect(0, 0, this.getWidth(), this.getHeight());
int red = (int)(Math.random()*255);
int blue = (int)(Math.random()*255);
int green = (int)(Math.random()*255);
// 创建随机色
Color color = new Color(red, green, blue);
g.setColor(color);
// 绘制覆盖物
g.fillOval(70, 70, 100, 100);
}
}

// 使用自定义的组件:
public class TestGui {
void init() {
JFrame frame = new JFrame(); // 创建 frame
CustomComponent cc = new CustomComponent();
frame.getContentPane().add(cc);
frame.setSize(300, 300);
frame.setVisible(true);
}
}

什么是内部类?如何创建内部类的实例?

一个类可以嵌套在另一个类的内部,这便构成了内部类。内部类可以访问外部类中的所有成员,包括外部类的成员变量和成员方法,即使它们是私有的。

public class OuterClass {
private int x;

InnerClass ic = new InnerClass(); // 创建内部类实例
public void foo() {
System.out.println("outer class -> 1: " + x);
ic.go();
System.out.println("outer class -> 3: " + x);
}
// 内部类
class InnerClass {
void go() {
x = 42; // 访问外部类的成员变量 x
System.out.println("inner class -> 2 : "+x);
}
}

public static void main(String[] args) {
OuterClass oc = new OuterClass();
oc.foo();
// 另一种 创建内部类实例的方式
OuterClass.InnerClass ocic = oc.new InnerClass();
ocic.go();
}
}

posted @   就叫清风吧  阅读(23)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示