سؤال

وأنا باستخدام مكتبة مجموعات جوجل <لأ href = "http://google-collections.googlecode.com/svn/trunk/javadoc/com/google/common/collect/AbstractIterator.html" يختلط = "نوفولو noreferrer "> AbstractIterator لتنفيذ المولد. وعدوت عبر مشكلة أثناء القيام بذلك؛ لقد خفضت إلى نوع أكثر الأساسي وتتكرر المشكلة. هذا التخفيض هو مبالغة من الواضح لماذا يفعل ذلك، عد من 1 إلى numelements عبر Iterable.

وأساسا في التعليمة البرمجية التالية، وإصدار uncommented يعمل، وعلق أحدهم لا (يوفر عنصر باطل آخر، بدلا من المنتهية في العدد الأخير).

وأنا أفعل شيئا خاطئا، أو غير هذا وجود مشكلة في المكتبة؟

private Iterable<Integer> elementGenerator(final int numelements) {
  return new Iterable<Integer>() {
    @Override public Iterator<Integer> iterator() {
      return new AbstractIterator<Integer>(){
        int localcount=0;
        @Override protected Integer computeNext() {
          if (localcount++ == numelements) return endOfData();
          return localcount;
          // return (localcount++ == numelements) ? endOfData() : localcount;
        }
      };
    }
  };
}

وأنا أيضا حاولت تافه حولها مع ترتيب ?: (على سبيل المثال، التقديم عودة ومقارنة +1 بدلا من ذلك)، ولكن دون جدوى. أنا مطعون حول بعض الشيء تبحث عن وثائق حول هذا الموضوع، لكنها لم تجد أي شيء. ومن الواضح أن بناء الجملة ?: ليست سوى الراحة، وليس ضرورة، ولكن لا يزال ...

هل كانت مفيدة؟

المحلول

ويمكنك الحصول على NullPointerException بسبب استخدام المشغل الثلاثي، التعبير الشرطي، مع أنواع مختلفة العددية. جافا لديها قواعد معقدة عند خلط القيم العددية للأنواع المختلفة في التعبير الثلاثي: <لأ href = "http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.25" يختلط = "noreferrer "> JLS Section 15.25 .

وبالنظر إلى أن من preceived endOfData() للعودة Integer، في حين localcount هو int، جافا unboxes قيمة endOfData(). ومع ذلك، بالنظر إلى أن endOfData() إرجاع قيمة خالية نتائج العملية علبته إلى استثناء مؤشر فارغة.

ويمكنك إما الاستمرار في استخدام إذا البيان، أو أن تعلن localcount كما Integer.

نصائح أخرى

وأتوقع أن المشكلة هي مع استخدامك للمشغل postincrement، بالتعاون مع المشغل الثلاثي كذلك. لأن التعليقات الجانبية من ذلك، يجب أن يكون قصاصات اثنين يعادل تماما - وانها بالكاد خطأ AbstractIterator إذا انهم ليسوا كما يطلق أيا من رمزها في هذه النقطة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top