2017-09-16 5 views
-1

私は本を読んでいるのでテスト目的であり、私は演習で触れたプログラムを見つけることができませんでした。おそらくそれをデバッグして分析するために、ArrayIndexOutOfBoundExceptionを作成する必要があります。ArrayIndexOutOfBoundExceptionを強制する?

たとえば、BufferOverFlowのようなものにする必要があります。 Cでは、Javaの良い例ではないかもしれません。

プログラムは、1つのアレイから別のアレイに割り当てられたものをサーバー経由で実行しているようです。

クライアントでは、制限付きコンテンツとして10の文字列配列があります。サーバーのプログラムは10文字以上の文字列を入力します。

ご迷惑をおかけして申し訳ありません。

この動作はなぜですか? Javaプログラミング言語で

クライアント

import java.io.*; 
import java.net.*; 
import java.util.*; 

public class JSimpleClient { 
Socket sock; 
Scanner eingabe; 
String[] sat = new String[10]; 
BufferedWriter bw; 
ObjectInputStream stream; 
String s; 

public static void main(String[] args) throws ClassNotFoundException { 
    JSimpleClient ct = new JSimpleClient(); 
    ct.jetzt(); 
} 
public void jetzt() throws ClassNotFoundException { 
    try { 
    sock = new Socket("127.0.0.1", 1000); 
    System.out.print("Bitte etwas eingeben:"); 
    eingabe = new Scanner(System.in); 
    String input = eingabe.nextLine(); 
    bw = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream())); 
    bw.write(input); 
    bw.newLine(); 
    bw.flush(); 

    stream = new ObjectInputStream(sock.getInputStream()); 
    sat = (String[]) stream.readObject(); 
    for(String d : sat) { 
    s = d; 
    System.out.println(s); 
    } 
    } catch (ArrayIndexOutOfBoundsException ex) {System.out.println("BufferOverFlow ?!");} 
    catch(IOException ex) {ex.printStackTrace();} 
} 
} 

サーバ

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.ObjectOutputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 
import java.util.logging.Level; 
import java.util.logging.Logger; 

public class JsimpleServer { 
String[] sa = {"okay","okay","okay","okay","okay","okay","okay" 
     ,"okay","okay","okay","okay","okay","okay","okay","okay","okay"}; 

BufferedReader reader; 
ObjectOutputStream oos; 
ServerSocket ss; 
Socket socket1; 
boolean swi = true; 

public static void main(String[] args) { 
    JsimpleServer jss = new JsimpleServer(); 
    jss.startApp(); 
} 

private void startApp() { 
    try { 
    ss = new ServerSocket(1000); 
    while(swi) { 
    socket1 = ss.accept(); 
    System.out.println("Server is started !"); 
    oos = new ObjectOutputStream(socket1.getOutputStream()); 
    oos.writeObject(sa); 

    reader = new BufferedReader(new InputStreamReader(socket1.getInputStream())); 
    System.out.println(reader.readLine()); 

    oos.close(); 
     } 
    } catch (IOException ex) {System.out.println("Couldn`t connect !"); 
     Logger.getLogger(JsimpleServer.class.getName()).log(Level.SEVERE, null, ex);} 
    } 
} 
+1

ArrayIndexOutOfBoundsExceptionを取得するには、配列、文​​字列、およびインデックスを使用して何かを行う必要があります。私が見る限り、あなたはそうではありません。 –

+0

私はsa []を16個の文字列で、[]を10個の制限付き配列で使用します。たぶんコード内のどこを操作するべきかを指摘するかもしれません。ありがとう –

+1

'ArrayIndexOutOfBoundExceptionを強制しますか?' [タグ:ソケット]とは何の関係もありません。 – EJP

答えて

1

、アレイは、オブジェクト(§4.3.1)は、動的に作成 であり、であってもよいですオブジェクトタイプ (§4.3.2)の変数に割り当てられます。

Link

sat = (String[]) stream.readObject(); 

あなたは長さ16あなたは何をすべきかの簡易版でsat新しい配列に代入されています:

static void test1() throws Exception { 

    String sat[] = new String[10]; 
    //server 
    String[] sa = {"okay", "okay", "okay", "okay", "okay", "okay", "okay" 
     , "okay", "okay", "okay", "okay", "okay", "okay", "okay", "okay", "okay"}; 

    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    ObjectOutputStream oos = new ObjectOutputStream(baos); 
    oos.writeObject(sa); 
    System.out.println(sat.length);//->10 
    //client 
    ObjectInputStream is = new ObjectInputStream(new ByteArrayInputStream(baos.toByteArray())); 
    sat = (String[]) is.readObject();//->sat points to another array now 
    System.out.println(sat.length);//->16 

    } 

この意志出力10と16本のラインで

おそらく期待通りに例外をスローしません。ここで

ArrayIndexOutOfBoundsExceptionをスローしますサンプルコードです:

static void test() { 

    String words[] = new String[]{"Hello", "beautiful", "world!"}; 

    for (int idx = 0; idx <= words.length; idx++) { 
     System.out.println(words[idx]); 
    } 
    } 
0

私は思ったが、私はforループに変更して、新しいString配列を追加したとしてそれは多分かなり良いではありません。そして今、それは例外を作成します。たぶん別のストリームを使用する方が良いでしょう。

ありがとうございます。

for(int i = 0; sat.length > i; i++) { 
s = sat[i]; 
sat2[i] = s; 
System.out.println("Array sat: " + sat.length); 
System.out.println("Array sat2: " + sat2.length); 
} 
0

この例外は、無効なインデックスを使用しようとするとスローされます。

シンプル

int [] array = { 0 } ; 
array[1]++; 

を行う必要があります。

関連する問題