java - 线程“AWT-EventQueue-0”java.lang.AbstractMethodError 中的异常:
问题描述
我正在学习java,最近遇到了soquee问题。在这件事上有这个项目要开发,我们在其中模拟了客户端和服务器的部分。服务器部分显然工作正常,但每次我运行客户端部分并尝试将一些文本发送到服务器时都会弹出以下错误:
Exception in thread "AWT-EventQueue-0" java.lang.AbstractMethodError: com.faculdade.chat.Cliente.keyTyped(Ljava/awt/event/KeyEvent;)V
at java.awt.Component.processKeyEvent(Component.java:6494)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2832)
at java.awt.Component.processEvent(Component.java:6316)
at java.awt.Container.processEvent(Container.java:2239)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2297)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1954)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:835)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:1103)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:974)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:800)
at java.awt.Component.dispatchEventImpl(Component.java:4760)
at java.awt.Container.dispatchEventImpl(Container.java:2297)
at java.awt.Window.dispatchEventImpl(Window.java:2746)
at java.awt.Component.dispatchEvent(Component.java:4711)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
at java.awt.EventQueue$4.run(EventQueue.java:733)
at java.awt.EventQueue$4.run(EventQueue.java:731)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
代码如下:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.faculdade.chat;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.Socket;
import javax.swing.*;
/**
*
* @author Marcos Henrique
*/
public class Cliente extends JFrame implements ActionListener, KeyListener {
private static final long serialVersionUID = 1L;
private JTextArea texto;
private JTextField txtMsg;
private JButton btnSend;
private JButton btnSair;
private JLabel lblHistorico;
private JLabel lblMsg;
private JPanel pnlContent;
private Socket socket;
private OutputStream ou;
private Writer ouw;
private BufferedWriter bfw;
private JTextField txtIP;
private JTextField txtPorta;
private JTextField txtNome;
public Cliente() throws IOException {
JLabel lblMessage = new JLabel("Verificar!");
txtIP = new JTextField("127.0.0.1");
txtPorta = new JTextField("12345");
txtNome = new JTextField("Cliente");
//
Object[] texts = {lblMessage, txtIP, txtPorta, txtNome};
JOptionPane.showMessageDialog(null, texts);
pnlContent = new JPanel();
texto = new JTextArea(10, 20);
texto.setEditable(false);
texto.setBackground(new Color(240, 240, 240));
txtMsg = new JTextField(20);
//
lblHistorico = new JLabel("Histórico");
lblMsg = new JLabel("Mensagem");
btnSend = new JButton("Enviar");
btnSend.setToolTipText("Enviar Mensagem");
btnSair = new JButton("Sair");
btnSair.setToolTipText("Sair do Chat");
//
btnSend.addActionListener(this);
btnSair.addKeyListener(this);
btnSend.addKeyListener(this);
txtMsg.addKeyListener(this);
JScrollPane scroll = new JScrollPane(texto);
texto.setLineWrap(true);
//
pnlContent.add(lblHistorico);
pnlContent.add(scroll);
pnlContent.add(lblMsg);
pnlContent.add(txtMsg);
pnlContent.add(btnSair);
pnlContent.add(btnSend);
//
pnlContent.setBackground(Color.LIGHT_GRAY);
texto.setBorder(BorderFactory.createEtchedBorder(Color.BLUE, Color.BLUE));
txtMsg.setBorder(BorderFactory.createEtchedBorder(Color.BLUE, Color.BLUE));
//
setTitle(txtNome.getText());
setContentPane(pnlContent);
setLocationRelativeTo(null);
setResizable(false);
// Tamanho da janela
setSize(250, 300);
setVisible(true);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
/*
* Método usado para conectar no server socket, retorna IO Exception caso dê algum erro.
* @throws IOException
*/
public void conectar() throws IOException {
socket = new Socket(txtIP.getText(), Integer.parseInt(txtPorta.getText()));
ou = socket.getOutputStream();
ouw = new OutputStreamWriter(ou);
bfw = new BufferedWriter(ouw);
bfw.write(txtNome.getText() + "\r\n");
bfw.flush();
}
/*
* Método usado para enviar mensagem para o server socket
* @param msg do tipo String
* @throws IOException retorna IO Exception caso dê algum erro.
*/
public void enviarMensagem(String msg) throws IOException {
if(msg.equals("Sair")) {
bfw.write("Desconectado \r\n");
texto.append("Desconectado \r\n");
} else {
bfw.write(msg + "\r\n");
texto.append(txtNome.getText() + " diz -> " + txtMsg.getText() + "\r\n");
}
bfw.flush();
txtMsg.setText("");
}
/*
* Método usado para receber mensagem do servidor
* @throws IOException retorna IO Exception caso dê algum erro.
*/
public void escutar() throws IOException {
InputStream in = socket.getInputStream();
InputStreamReader inr = new InputStreamReader(in);
BufferedReader bfr = new BufferedReader(inr);
String msg = "";
while(!"Sair".equalsIgnoreCase(msg)) {
if(bfr.ready()) {
msg = bfr.readLine();
}
if(msg.equals("Sair")) {
texto.append("Servidor caiu! \r\n");
}
else {
texto.append(msg + "\r\n");
}
}
}
/*
* Método usado quando o usuário clica em sair
* @throws IOException retorna IO Exception caso dê algum erro.
*/
public void sair() throws IOException {
enviarMensagem("Sair");
bfw.close();
ouw.close();
ou.close();
socket.close();
}
@Override
public void actionPerformed(ActionEvent e) {
try {
if(e.getActionCommand().equals(btnSend.getActionCommand())){
enviarMensagem(txtMsg.getText());
}
else {
if(e.getActionCommand().equals(btnSair.getActionCommand())) {
sair();
}
}
} catch (IOException e1) {
// Todo Auto-generated catch block
e1.printStackTrace();
}
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_ENTER) {
try {
enviarMensagem(txtMsg.getText());
} catch (IOException e1) {
// Todo Auto-generated catch block
e1.printStackTrace();
}
}
}
@Override
public void keyReleased(KeyEvent arg0) {
// Todo Auto-generated method stub
}
@Override
public void KeyTyped(KeyEvent arg0) {
// Todo Auto-generated method stub
}
public static void main(String[] args) throws IOException {
Cliente app = new Cliente();
app.conectar();
app.escutar();
}
}
我正在使用 NetBains IDE。
解决方案
推荐阅读
- c# - Active Directory:MSAL (UWP) PublicClientApplication.AcquireTokenAsync(...) 返回异常
- javascript - 如何将图像地图区域 ID 发送到 php 文件?
- eclipse - birt 报告列在导出到 excel 时自动调整大小
- amazon-web-services - 带有 Unauth 角色的 AWS/Cognito/IAM 错误
- python-3.x - 为什么 asyncio 被 processPool 阻塞?
- redmine - 组中的 Redmine API 用户
- html - External CSS is not working in NodeJS
- alexa-skills-kit - alexa 技能的 INVALID_SKILL_RESPONSE
- java - JAVA 中 SOAPConnection 的 SSL 设置
- conv-neural-network - 从预训练模型加载单层权重