运行时出现异常

技术科 2008-03-06 03:10:02
package com.corejava.L66;

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.Modifier;
import java.util.Enumeration;


import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;

public class ClassTreeTest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
ClassTreeFrame frame = new ClassTreeFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

class ClassTreeFrame extends JFrame {
private DefaultMutableTreeNode root;
private DefaultTreeModel model;
private JTextField textField;
private JTree tree;

public ClassTreeFrame() {
setTitle("类树");
setSize(400, 300);

root = new DefaultMutableTreeNode(java.lang.Object.class);
model = new DefaultTreeModel(root);

addClass(getClass());

ClassNameTreeCellRenderer renderer = new ClassNameTreeCellRenderer();
renderer.setClosedIcon(new ImageIcon("e.gif"));
renderer.setOpenIcon(new ImageIcon("r.gif"));
renderer.setLeafIcon(new ImageIcon("x.gif"));
tree.setCellRenderer(renderer);

add(new JScrollPane(tree), BorderLayout.CENTER);

addTextField();
}

public void addTextField() {
JPanel panel = new JPanel();
ActionListener addListener = new ActionListener() {
public void actionPerformed(ActionEvent event) {
try {
String text = textField.getText();
addClass(Class.forName(text));
textField.setText("");
} catch (ClassNotFoundException e) {
JOptionPane.showMessageDialog(null, "类未找到");
}
}
};

textField = new JTextField(20);
textField.addActionListener(addListener);
panel.add(textField);

JButton addButton = new JButton("添加");
addButton.addActionListener(addListener);
panel.add(addButton);

add(panel, BorderLayout.SOUTH);
}

public DefaultMutableTreeNode findUserObject(Object obj) {
Enumeration e = root.breadthFirstEnumeration();
while (e.hasMoreElements()) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) e
.nextElement();
if (node.getUserObject().equals(obj))
return node;
}
return null;
}

public DefaultMutableTreeNode addClass(Class c) {
if (c.isInterface() || c.isPrimitive())
return null;

DefaultMutableTreeNode node = findUserObject(c);
if (node != null)
return node;

Class s = c.getSuperclass();

DefaultMutableTreeNode parent;
if (s == null)
parent = root;
else
parent = addClass(s);

DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(c);
model.insertNodeInto(newNode, parent, parent.getChildCount());

TreePath path = new TreePath(model.getPathToRoot(newNode));
tree.makeVisible(path);

return newNode;
}
}

class ClassNameTreeCellRenderer extends DefaultTreeCellRenderer {
private Font plainFont = null;
private Font italicFont = null;

public Component getTreeCellRendererComponent(JTree tree, Object value,
boolean selected, boolean expanded, boolean leaf, int row,
boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, selected, expanded,
leaf, row, hasFocus);
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
Class c = (Class) node.getUserObject();

if (plainFont == null) {
plainFont = getFont();
if (plainFont != null)
italicFont = plainFont.deriveFont(Font.ITALIC);
}

if ((c.getModifiers() & Modifier.ABSTRACT) == 0)
setFont(plainFont);
else
setFont(italicFont);
return this;
}
}

报错如下:
Exception in thread "main" java.lang.NullPointerException
at com.corejava.L66.ClassTreeFrame.addClass(ClassTreeTest.java:120)
at com.corejava.L66.ClassTreeFrame.addClass(ClassTreeTest.java:114)
at com.corejava.L66.ClassTreeFrame.addClass(ClassTreeTest.java:114)
at com.corejava.L66.ClassTreeFrame.addClass(ClassTreeTest.java:114)
at com.corejava.L66.ClassTreeFrame.addClass(ClassTreeTest.java:114)
at com.corejava.L66.ClassTreeFrame.addClass(ClassTreeTest.java:114)
at com.corejava.L66.ClassTreeFrame.<init>(ClassTreeTest.java:51)
at com.corejava.L66.ClassTreeTest.main(ClassTreeTest.java:32)
...全文
77 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
hmsuccess 2008-03-06
  • 打赏
  • 举报
回复
问题是处在反射上: addClass(getClass());
dracularking 2008-03-06
  • 打赏
  • 举报
回复
重点查addClass方法吧
貌似后面行号都给了
yami251139 2008-03-06
  • 打赏
  • 举报
回复
報的是空指針main里面
但你main里面好像什么都沒做吧。。。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧