2014-01-17 3 views
-2
public class leftrec { 

static int isleft(String[] left,String[] right) 

    { 
     int f=0; 
     for(int i=0;i<left.length;i++) 
     { 
      for(int j=0;j<right.length;j++) 

      { 
       if(left[i].charAt(0)==right[j].charAt(0)) 
       { 
        System.out.println("Grammar is left recursive"); 
        f=1; 
       } 

      } 
     } 
      return f; 
    } 
    public static void main(String[] args) { 
     // TODO code application logic here 
     String[] left=new String[10]; 
     String[] right=new String[10]; 
     Scanner sc=new Scanner(System.in); 
     System.out.println("enter no of prod"); 
     int n=sc.nextInt(); 
     for(int i=0;i<n;i++) 
     { 
      System.out.println("enter left prod"); 
      left[i]=sc.next(); 
      System.out.println("enter right prod"); 
      right[i]=sc.next(); 
     } 

     System.out.println("the productions are"); 
     for(int i=0;i<n;i++) 
     { 
      System.out.println(left[i]+"->"+right[i]); 
     } 
     int flag=0; 
     flag=isleft(left,right); 
      if(flag==1) 
      { 
       System.out.println("Removing left recursion"); 
      } 
      else 
      { 
       System.out.println("No left recursion"); 
      }  
    } 
} 

주어진 문법이 재귀 적으로 남아 있는지 확인하기 위해이 코드를 작성했습니다. 내가 프로그램을 컴파일 할 때 나에게 줄Java에서 NullPointerException 제거

if(left[i].charAt(0)==right[j].charAt(0)) 

isleft(left,right); 

어떻게 내가 예외를 제거하는 방법은 무엇에 NullPointerException을 준다?

+0

클래스 이름은 대문자로 클래스를 정의하는 – lakshman

+0

를 사용하여 자바 코딩 규칙을 시작합니다 (ArrayList를 오른쪽 ArrayList를 왼쪽)

배열 목록

입니다. 클래스 이름은 Camel Case 여야합니다. –

+0

코드를 컴파일 할 때? 아니면 코드를 실행합니까? –

답변

2

나는 당신의 입력을 가진 문제를 추측, 당신은 10

String[] left=new String[10]; 
String[] right=new String[10]; 

망가 하드 코딩 문자열 배열 길이

int n=sc.nextInt(); 
String[] left=new String[n]; 
String[] right=new String[n]; 
for(int i=0;i<n;i++){ 
    System.out.println("enter left prod"); 
    left[i]=sc.next(); 
    System.out.println("enter right prod"); 
    right[i]=sc.next(); 
} 

이 될 것입니다 수있는 문제로 문자열 배열의 길이를 복용 다음과 같이 ::

+0

이 테스트를 통과 했으므로 –

0

당신은 코드를 변경해야

package com.cgi.ie2.common; 

import java.util.Scanner; 

public class LeftRecursive { 

static int isleft(String[] left, String[] right) 
{ 
    int f = 0; 
    for (int i = 0; i < left.length; i++) { 
     for (int j = 0; j < right.length; j++) 
     { 
      if (left[i].charAt(0) == right[j].charAt(0)) { 
       System.out.println("Grammar is left recursive"); 
       f = 1; 
      } 
     } 
    } 
    return f; 
} 

public static void main(String[] args) { 
    // TODO code application logic here 
    Scanner sc = new Scanner(System.in); 
    System.out.println("enter no of prod"); 
    int n = sc.nextInt(); 
    //Changes done here:::: 
    String[] left = new String[n]; 
    String[] right = new String[n]; 
    for (int i = 0; i < n; i++) { 
     System.out.println("enter left prod"); 
     left[i] = sc.next(); 
     System.out.println("enter right prod"); 
     right[i] = sc.next(); 
    } 

    System.out.println("the productions are"); 
    for (int i = 0; i < n; i++) { 
     System.out.println(left[i] + "->" + right[i]); 
    } 
    int flag = 0; 
    flag = isleft(left, right); 
    if (flag == 1) { 
     System.out.println("Removing left recursion"); 
    } else { 
     System.out.println("No left recursion"); 
    } 
} 
    } 

이 코드는 NullpointerExceptions을 제거합니다.

콘솔에서 자극의, 문자열 배열은 내가 당신을 제안 할 것은 당신이 기본적인 코딩 규칙을 따를 필요가있다 내가 수행 한 변경 사항이 있음을 ::

System.out.println("enter no of prod"); 
    int n = sc.nextInt(); 
    //Changes done here:::: 
    String[] left = new String[n]; 
    String[] right = new String[n]; 

을 위해 그리고 더 나은 코드를 들면, 그에 따라 설정해야하는 코딩 규칙 코딩 규칙의 기본 개념 ::

http://www.javacodegeeks.com/2012/10/java-coding-conventions-considered-harmful.html http://java.about.com/od/javasyntax/a/nameconventions.htm

을 알아 보았 너무 다음 링크를 통해 이동하시기 바랍니다, 수행하는 경우 코드는 완벽, 그것은 corectly 실행되는 경우에만 코드가 완벽하지, 당신의 코드를 읽을 수 있습니다
0

si없이 배열을 초기화 할 수 없습니다. ze. 배열 크기를 이미 10로 지정했으며 10보다 크거나 10보다 작은 제품을 입력하면 오류가 발생합니다. 동적 크기를 사용하려면 Java 컬렉션을 사용해야합니다. 이를위한 가장 좋은 방법은 정적 INT isLeft

{ 
     int f = 0; 
     for (int i = 0; i < left.size(); i++) { 
      for (int j = 0; j < right.size(); j++) 

      { 
       if (left.get(i).charAt(0) == right.get(j).charAt(0)) { 
        System.out.println("Grammar is left recursive"); 
        f = 1; 
       } 

      } 
     } 
     return f; 

    } 

    public static void main(String[] args) { 
     // TODO code application logic here 
     ArrayList<String> left = new ArrayList<String>(); 
     ArrayList<String> right = new ArrayList<String>(); 


     Scanner sc = new Scanner(System.in); 
     System.out.println("enter no of prod"); 
     int n = sc.nextInt(); 
     for (int i = 0; i < n; i++) { 
      System.out.println("enter left prod"); 
      String leftText = sc.next(); 
      left.add(leftText); 
      System.out.println("enter right prod"); 
      String rightText = sc.next(); 
      right.add(rightText); 
     } 

     System.out.println("the productions are"); 
     for (int i = 0; i < n; i++) { 
      System.out.println(left.get(i) + "->" + right.get(i)); 
     } 
     int flag; 
     flag = isLeft(left, right); 
     if (flag == 1) { 
      System.out.println("Removing left recursion"); 
     } else { 
      System.out.println("No left recursion"); 
     } 

    }