NoSuchElementException:找不到行?

时间:2013-11-14 02:32:20

标签: java printwriter nosuchelementexception

我正在努力在java中创建一个PalindromeServer,但是我一直发现一个没有找到行的错误,这似乎来自我的PrintWriter,但我无法弄清楚原因。有人可以解释是什么导致找不到行错误吗?

我的代码

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;


public class PalindromeServer {

public static void main(String[] args){
    try{
    int port = 5150;
    ServerSocket ssocket = new ServerSocket(port);


    Socket client = ssocket.accept();

    OutputStream outStream = client.getOutputStream();
    Scanner scan = new Scanner(client.getInputStream());
    PrintWriter writer = new PrintWriter(outStream, true);

    while(scan.hasNextLine()){
        String in = scan.nextLine();
        String out = "";
        if(in.equals("SHUT DOWN")){
            ssocket.close();
        }
        in.replaceAll("\\s+","");
        int length = in.length();

          for ( int i = length - 1 ; i >= 0 ; i-- ){  
             out = out + in.charAt(i);
          }
          in.toLowerCase();
          out.toLowerCase();

          if(in.equals(out)){
              writer.print("YES");
              client.close();
          }
          else{
              writer.print("NO");
              client.close();
          }
    }

}catch (IOException e) {}

}
}

Junit测试

import org.junit.runners.MethodSorters;

import static org.junit.Assert.*;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.FixMethodOrder;
import org.junit.Test;

@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class PalindromeServerTest {
@BeforeClass
public static void startServer() {
    // run server
    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            PalindromeServer.main( null );
        }
    });
    thread.start();
}
@Before
public void waitTwoSecondsBetweenTests() {
    try {
        Thread.sleep( 2000 );
    } 
    catch (InterruptedException e) {
        e.printStackTrace();
    }
}

@Test(timeout=3000)
public void testServerWithNonPalindrome() {
    try {
        // run client
        Socket      socket  = new Socket( "localhost", 5150 );
        Scanner     scanner = new Scanner    ( socket.getInputStream() );
        PrintWriter writer  = new PrintWriter( socket.getOutputStream(), true );

        writer.println( "Not in Here" );

        String result = scanner.nextLine();
        assertEquals( "Incorrect result", "NO", result );

        socket.close();
    }
    catch (IOException e) {
        e.printStackTrace();
        fail( "Error opening client socket" );
    }
}

@Test(timeout=3000)
public void testServerWith1LetterPalindrome() {
    try {
        // run client
        Socket      socket  = new Socket( "localhost", 5150 );
        Scanner     scanner = new Scanner    ( socket.getInputStream() );
        PrintWriter writer  = new PrintWriter( socket.getOutputStream(), true );

        writer.println( "Z" );

        String result = scanner.nextLine();
        assertEquals( "Incorrect result", "YES", result );

        socket.close();
    }
    catch (IOException e) {
        e.printStackTrace();
        fail( "Error opening client socket" );
    }
}

@Test(timeout=3000)
public void testServerWithPalindrome() throws IOException {
    try {
        // run client
        Socket      socket  = new Socket( "localhost", 5150 );
        Scanner     scanner = new Scanner    ( socket.getInputStream() );
        PrintWriter writer  = new PrintWriter( socket.getOutputStream(), true );

        writer.println( "Kayak" );

        String result = scanner.nextLine();
        assertEquals( "Incorrect result", "YES", result );

        socket.close();
    }
    catch (IOException e) {
        e.printStackTrace();
        fail( "Error opening client socket" );
    }
}

@Test(timeout=3000)
public void testServerWithPerfectPalindrome() throws IOException {
    try {
        // run client
        Socket      socket  = new Socket( "localhost", 5150 );
        Scanner     scanner = new Scanner    ( socket.getInputStream() );
        PrintWriter writer  = new PrintWriter( socket.getOutputStream(), true );

        writer.println( "Able was I ere I saw Elba" );

        String result = scanner.nextLine();
        assertEquals( "Incorrect result", "YES", result );

        socket.close();
    }
    catch (IOException e) {
        e.printStackTrace();
        fail( "Error opening client socket" );
    }
}

@Test(timeout=3000)
public void testServerWithCapitalizedPalindrome() throws IOException {
    try {
        // run client
        Socket      socket  = new Socket( "localhost", 5150 );
        Scanner     scanner = new Scanner    ( socket.getInputStream() );
        PrintWriter writer  = new PrintWriter( socket.getOutputStream(), true );

        writer.println( "I prefer PI" );

        String result = scanner.nextLine();
        assertEquals( "Incorrect result", "YES", result );

        socket.close();
    }
    catch (IOException e) {
        e.printStackTrace();
        fail( "Error opening client socket" );
    }
}

@Test(timeout=3000)
public void testServerWithNonSense() throws IOException {
    try {
        // run client
        Socket      socket  = new Socket( "localhost", 5150 );
        Scanner     scanner = new Scanner    ( socket.getInputStream() );
        PrintWriter writer  = new PrintWriter( socket.getOutputStream(), true );

        writer.println( "I want my mojo back!" );

        String result = scanner.nextLine();
        assertEquals( "Incorrect result", "NO", result );

        socket.close();
    }
    catch (IOException e) {
        e.printStackTrace();
        fail( "Error opening client socket" );
    }
}

@Test(expected = IOException.class)
public void test_RunsLast_ServerShutsDown() throws IOException {
    try {
        // running client #1...shuts down server
        Socket      socket  = new Socket( "localhost", 5150 );
        PrintWriter writer  = new PrintWriter( socket.getOutputStream(), true );

        writer.println( "SHUT DOWN" );

        socket.close();
    }
    catch (IOException e) {
        e.printStackTrace();
        fail( "Error opening client socket" );
    }
    waitTwoSecondsBetweenTests();

    // running client #2...should throw exception (server should have stopped)
    new Socket( "localhost", 5150 );
    fail( "Socket should not connect after server was shut down" );
}

错误

java.util.NoSuchElementException: No line found
at java.util.Scanner.nextLine(Unknown Source)
at PalindromeServerTest.testServerWith1LetterPalindrome(PalindromeServerTest.java:69)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.FailOnTimeout$StatementThread.run(FailOnTimeout.java:74)

1 个答案:

答案 0 :(得分:0)

scan“找不到行”(NoSuchElementException),因为您正在关闭client。迭代完成循环后等待关闭客户端

while(scan.hasNextLine()) {
   ...

   if(in.equals(out)){
       writer.print("YES");
   }
   else{
       writer.print("NO");
   }

   ...
}

client.close();