jRuby-1.6.5:NoMethodError未定义方法'[]'为nil:NilClass

时间:2011-12-19 23:59:46

标签: ruby-on-rails jruby metrics nomethoderror

我的环境:

jRuby-1.6.5
Rails 2.3.8

宝石:

  • actionmailer(2.3.8)
  • actionpack(2.3.8)
  • activerecord(2.3.8)
  • activerecord-jdbc-adapter(1.1.1)
  • activerecord -jdbcpostgresql-adapter(0.8.2)
  • activeresource(2.3.8)
  • activesupport(2.3.8)
  • arel(2.2.1)
  • bouncy-castle-java(1.5.0145.2)
  • builder(3.0.0)
  • bundler(1.0.21)
  • capybara(0.4.1.2)
  • celerity(0.8.9)
  • childprocess(0.1.8)
  • columnize(0.3.2)
  • 配置(1.2.0)
  • 黄瓜(0.10.0)
  • cucumber-rails(0.3.2)
  • culerity(0.2.15)
  • database_cleaner(0.6.6)
  • diff-lcs(1.1.2)
  • factory_girl(1.3.3)
  • fastercsv(1.5.4)
  • ffi(1.0.7)
  • gem_plugin(0.2.3)
  • 小黄瓜(2.3.5)
  • jdbc-postgres(8.4.702)
  • jruby-jars(1.5.5)
  • jruby-openssl(0.7.3)
  • json(1.4.6)
  • json_pure(1.5.1)
  • launchy(0.4.0)
  • mime-types(1.16)
  • nokogiri(1.4.4.2)
  • rack(1.1.0)
  • rack-test(0.5.7)
  • rails(2.3.8)
  • rake(0.8.7)
  • rcov(0.9.9)
  • rspec(1.3.1)
  • rspec-rails(1.3.3)
  • ruby​​-debug(0.10.4)
  • ruby​​-debug-base(0.10.4)
  • ruby​​zip(0.9.4)
  • selenium-client(1.2.18)
  • selenium-webdriver(0.1.4)
  • 来源(0.0.1)
  • term-ansicolor(1.0.5)
  • 弱化(0.0.4)
  • xpath(0.1.3)

使用jRuby-1.6.5和metrical gem,遇到了以下问题:

从应用程序的根目录执行metrical

解析app和lib文件夹中的所有ruby文件后,命令行输出以下内容:

NoMethodError: undefined method `[]' for nil:NilClass
   initialize at c:/jruby-1.6.5/lib/ruby/gems/1.8/gems/metric_fu-2.1.1/lib/generators/saikuro.rb:232
   get_elements at c:/jruby-1.6.5/lib/ruby/gems/1.8/gems/metric_fu-2.1.1/lib/generators/saikuro.rb:169
   initialize at c:/jruby-1.6.5/lib/ruby/gems/1.8/gems/metric_fu-2.1.1/lib/generators/saikuro.rb:130
   assemble_files at c:/jruby-1.6.5/lib/ruby/gems/1.8/gems/metric_fu-2.1.1/lib/generators/saikuro.rb:111
   each at org/jruby/RubyArray.java:1612assemble_files at c:/jruby-1.6.5/lib/ruby/gems/1.8/gems/metric_fu-2.1.1/lib/generators/saikuro.rb:109
   analyze at c:/jruby-1.6.5/lib/ruby/gems/1.8/gems/metric_fu-2.1.1/lib/generators/saikuro.rb:27
   send at org/jruby/RubyKernel.java:2093
   generate_report at c:/jruby-1.6.5/lib/ruby/gems/1.8/gems/metric_fu-2.1.1/lib/base/generator.rb:130
   each at org/jruby/RubyArray.java:1612
   generate_report at c:/jruby-1.6.5/lib/ruby/gems/1.8/gems/metric_fu-2.1.1/lib/base/generator.rb:128
   add at c:/jruby-1.6.5/lib/ruby/gems/1.8/gems/metric_fu-2.1.1/lib/base/report.rb:60
   run_metric_fu at c:/jruby-1.6.5/lib/ruby/gems/1.8/gems/metrical-0.0.7/lib/metrical.rb:51
   each at org/jruby/RubyArray.java:1612
   run_metric_fu at c:/jruby-1.6.5/lib/ruby/gems/1.8/gems/metrical-0.0.7/lib/metrical.rb:51
   run at c:/jruby-1.6.5/lib/ruby/gems/1.8/gems/metrical-0.0.7/lib/metrical.rb:18
   (root) at c:/jruby-1.6.5/lib/ruby/gems/1.8/gems/metrical-0.0.7/bin/metrical:4
   load at org/jruby/RubyKernel.java:1063
   (root) at c:\jruby-1.6.5\bin\metrical:19

问题出在哪里我不知道,只是想知道如何绕过它,或者可能避免它,因为我的团队无法看到给定代码的指标,这非常令人恼火。

提前谢谢。

1 个答案:

答案 0 :(得分:1)

让我们看看堆栈跟踪。它告诉了你很多。

在堆栈顶部,您会看到saikuro.rb:232。就是这样:

https://github.com/jscruggs/metric_fu/blob/4c12cfa9cf20e38d4d1e3e01455613ff48563ad8/lib/generators/saikuro.rb#L232

只有一个方法调用[],因此可以安全地假设line.match(TYPE_REGEX)nil。这是为什么?好吧,我们不知道。但是看一下堆栈,我们相当肯定我们在为@file_handle阅读Saikuro::SFile时遇到了这种情况。我们找不到与TYPE_REGEX=/Type:(.*) Name/匹配的行。

了解Saikuro::SFile.new获得的参数将是非常有益的。尝试搜索它,并检查文件内容。